package com.yearner.reviewplan.common.util;

import java.lang.reflect.Field;
import java.util.List;

/**
 * @author pengyg
 * @since 2020/2/24
 */
public class CheckDataUtil {
    @FunctionalInterface
    public interface Operation<T>{
        boolean test(T t);
    }

    /**
     * 判断是否存在 “非法” 的变量
     * @param op “非法”的判定
     * @param values 变量
     * @param <T> 泛型
     * @return true(有非法变量) or false
     */
    @SafeVarargs
    public static <T> boolean haveIllegalValues(Operation<T> op, T... values) {
        if (values != null && op !=null) {
            try {
                for (T t : values) {
                    if (op.test(t)) {
                        return true;
                    }
                }
                //全部遍历一遍，没有非法变量
                return false;
            }catch (Exception e) {
                return true;
            }
        }
        return true;
    }


    /**
     * 测试是否全部符合要求
     * @param op
     * @param values
     * @param <T>
     * @return
     */
    @SafeVarargs
    public static <T> boolean isAllConfirm(Operation<T> op, T... values) {
        if (values != null && op !=null) {
            int count = 0;
            try {
                for (T t : values) {
                    count += (op.test(t)) ? 1 : 0;
                }
                //全部遍历一遍，没有非法变量
                return count==values.length;
            }catch (Exception e) {
                return false;
            }
        }else
            return false;
    }
    /**
     * 检测类中的某个属性是否为 null 或""
     * @param e
     * @param strList 属性名称 list
     * @return
     * @throws IllegalAccessException
     */
    public static <T> boolean haveEmptyField(T e, List strList) throws IllegalAccessException {
        boolean isEmpty = false;
        if (e == null) {
            isEmpty = true;
        } else {
            Field[] fields = e.getClass().getDeclaredFields();
            for (Field field : fields) {
                if (strList.contains(field.getName())) {
                    field.setAccessible(true);
                    if (field.get(e) == null || field.get(e).toString().isEmpty()) {
                        return true;
                    }
                }
            }
        }
        return isEmpty;
    }
}
